package pe.org.jhsystem.consola.applet;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author jhuamanv
 */
public class Ejemplo2 extends JApplet {

    //atributos de clase
    private int a, b, c, d;
    private JTextField n1, n2, n3, n4;
    private JComboBox comboOp;
    private JButton btnOrdenar;
    private JLabel salida;
    private String[] opc = {"Ordenamiento","Ascendente","Descendente"};

    /** Este es el metodo constructor para el applet
     * simplemente configura la interfaz
     */
    public void init(){
        configuraInterfaz();
    }

    /** Este es el metodo start
     * simplemente re-configura la interfaz
     */
    public void start(){
        n1.setText(null);
        n2.setText(null);
        n3.setText(null);
        n4.setText(null);
        comboOp.setSelectedIndex(0);
        a = b = c = d = 0;
    }

    /** Este es el metodo stop
     * simplemente re-configura la interfaz
     */
    public void stop(){
        n1.setText(null);
        n2.setText(null);
        n3.setText(null);
        n4.setText(null);
        comboOp.setSelectedIndex(0);
        salida.setText(null);
        a = b = c = d = 0;
    }

    /** Con este metodo se configura la
     * apariencia de la interfaz del applet.
     */
    private void configuraInterfaz(){
        this.getContentPane().setLayout(new FlowLayout());
        n1 = new JTextField(2);
        n2 = new JTextField(2);
        n3 = new JTextField(2);
        n4 = new JTextField(2);
        comboOp = new JComboBox(opc);
        comboOp.addActionListener((ActionListener) this);
        btnOrdenar = new JButton("Ordenar");
        btnOrdenar.addActionListener((ActionListener) this);
        salida = new JLabel("Ordenamiento: ");
        //se agregan los componentes al panel del applet
        add(n1);
        add(n2);
        add(n3);
        add(n4);
        add(comboOp);
        add(btnOrdenar);
        add(salida);
    }

    /** con este metodo se obtienen los
     * valores que se han introducido en los
     * campos de texto.
     * @return
     */
    private boolean obtenerValores(){
        try{//Con este bloque try-catch se controlan las excepciones
            a = Integer.parseInt(n1.getText());
            b = Integer.parseInt(n2.getText());
            c = Integer.parseInt(n3.getText());
            d = Integer.parseInt(n4.getText());
        }catch(NumberFormatException exc){
            JOptionPane.showMessageDialog(this, "valores numericos invalidos");
        }

        return true;
    }

    /** Con este metodo se ordenan 4 numeros enteros
     * solo se usan 5 comparaciones.
     * los valores se suponen distintos
     * @return true
     */
    private boolean ordenarEnteros(){
        int mayor, menor;
        //el ordenamiento debe ser: a < b < c < d
    	//por lo tanto ....
    	if(d < c){//comparacion 1
    		menor = d;
    		mayor = c;
    		//pero ...
    		d = mayor;
    		c = menor;
    	}
    	if(c < b){//comparacion 2
    		menor = c;
    		mayor = b;
    		//pero ...
    		c = mayor;
    		b = menor;
    	}
    	if(b < a){//comparacion 3
    		menor = b;
    		mayor = a;
    		//pero ...
    		b = mayor;
    		a = menor;
    	}
    	if(d < c){//comparacion 4
    		menor = d;
    		mayor = c;
    		//pero ...
    		d = mayor;
    		c = menor;
    	}
    	if(c < b){//comparacion 5
    		menor = c;
    		mayor = b;
    		//pero ...
    		c = mayor;
    		b = menor;
    	}

        return true;
    }

    /** Este metodo pertenece a la interfaz ActionListener
     * permite controlar eventos.
     * @param e
     */
    public void actionPerformed(ActionEvent e) {
        String opcion;
        opcion = (String)comboOp.getSelectedItem();
        if(e.getSource() == btnOrdenar && (!opcion.equals("Ordenamiento"))){
            obtenerValores();
            ordenarEnteros();
            if(opcion.equals("Ascendente")){
                salida.setText("Ordenamiento: " + a + " < " + b + " < " + c + " < " + d);
            }else{
                salida.setText("Ordenamiento: " + d + " > " + c + " > " + b + " > " + a);
            }
        }
    }
}
